package com.qf.service.impl;

import com.qf.dao.UserDao;
import com.qf.dao.impl.UserDaoImpl;
import com.qf.service.UserService;
import com.qf.pojo.TbUser;
import com.qf.utils.EmailUtils;
import com.qf.utils.MD5Utils;

import java.util.UUID;
import java.util.concurrent.CompletableFuture;

/**
 * Create by 周志豪 on 2022/8/21  10:45
 *
 * @authoe 周志豪
 * @veision 1.0
 * //TODO  想好了再去做
 * @since 1.0
 */

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl();
    @Override
    public int addUser(TbUser user) {
        //设置数据
        //修改密码为MD5
        user.setPassword(MD5Utils.md5(user.getPassword()));
        //设置code,这个code是一个随机的内容,并不是真正的随机数,这个code 的目的是和用户绑定,激活的时候通过code来区分谁在激活
        //激活的时候需要传递code过来,我们一般发送邮件的时候会将code带过去,用户点击链接的时候会带着code回来
        user.setCode(UUID.randomUUID().toString().replace("-", ""));
        //添加到数据库
        int result = userDao.addUser(user);
        //发送邮件
        //发送邮件如果失败了,注册要回滚吗?不需要,现在我们有一个后续的操作,这个操作属于核心操作吗,不属于核心操作,并且这个操作的成功失败不影响核心操作
        //结合上面的分析,我们发送邮件可以设置为异步操作

        System.err.println(Thread.currentThread().getName());
        CompletableFuture.runAsync(() -> {
            //把我们要执行的操作歇过来
            EmailUtils.sendEmail(user);
        });
        return result;
    }

    @Override
    public TbUser login(String username, String password) {
        //按照用户名查询
        TbUser user = userDao.findByUserName(username);
        if (user != null) {
            //获取到查询到的密码
            String userPassword = user.getPassword();
            //将输入的密码转成md5
            String md5 = MD5Utils.md5(password);
            if (userPassword.equalsIgnoreCase(md5)) {
                //如果密码一致就返回
                return user;
            }
        }
        return null;
    }

    @Override
    public int updateLoginTime(Long userId) {
        return userDao.updateLoginTime(userId);
    }
}
